customId ( と value )になるべく長いバイト列を入れたい
customIdは100文字以下であることが求められている。
valueは50文字以下。
ここになるべく多くのバイト列を突っ込みたい。
これは特に ephemeral なメッセージにつけた component からの interaction を処理する場合に重要になる
code:json
"message" : {"flags" : 64, "id" : "860181655317512205"}
上記は ephemeral なメッセージにつけた component からの interaction の message オブジェクトの内容である。
discordの言う1文字は1コードポイントのことである。
Unicodeのコードポイントはおよそ20bitの長さをもっている。
正確には21bitであるがそんなに嬉しくないので20bitということにする
エンコードとデコードの手間の割に得られるのは12byte分の領域である
実際にはもっと少なさそうtig.icon
1文字で2.5byte表現できる
65536加算されているのは小さな値をコードポイントとして使用するとUnicodeのコードポイントとして不正な部分を踏むことがあるため。
code:js
function chunk(arr, size) {
return arr.reduce(
[]
);
}
}
function encode(arr) {
return String.fromCodePoint(...chunk(arr,5).flatMap(encode_helper).map(e=>e+65536));
}
function parse_helper(a,b) { }
function parse(str) {
return chunk(...str.map(e=>e.codePointAt(0)).map(e=>e-65536),2).flatMap(parse_helper); }
code:js
parse(encode([]))
[]
100
/a{250}/.test(Buffer.from(parse(encoded)).toString())
true